
/**
 * 
 * 数组组成的最小数字
 * 
 * 题目描述

给定一个整型数组，请从该数组中选择3个元素组成最小数字并输出（如果数组长度小于3，则选择数组中所有元素来组成最小数字）。

输入描述
一行用半角逗号分割的字符串记录的整型数组

0 < 数组长度 ≤ 100
0 < 整数的取值范围 ≤ 10000
输出描述
由3个元素组成的最小数字，如果数组长度小于3，则选择数组中所有元素来组成最小数字。

用例
输入	21,30,62,5,31
输出	21305
说明	数组长度超过3，需要选3个元素组成最小数字，21305由21,30,5三个元素组成的数字，为所有组合中最小的数字。
输入	5,21
输出	215
说明	数组长度小于3， 选择所有元素来组成最小值，215为最小值。
 */

import java.util.Arrays;
import java.util.Scanner;

/**
  * 题目解析
本题直接对数组进行字典序升序，拼接后得到的组合数，不一定是最小的，比如数组 [3, 32, 321]，此时按照字典序升序后，还是 [3, 32, 321]，拼接出来为332321，而这显然不是最小的组合数，最小的组合数应该是321323。

对于三个数及以上的数组，我们需要从中取出3个数，这3个数，首先需要保证总长度最短，即保证组合数的位数最少，其值才能最小，因此我们需要将数组（按数值大小）升序，这样小数在前，大数在后，在保证总长度最小的同时，也能保证局部元素最优。比如 [1,23,456,457,2111]，取数值升序后的前三个数1，23，456，是最优的。

获得最优前三个元素后，按照如下规则排序：

尝试对要组合的两个数字串 a，b 进行组合，此时有两种组合方式：
a + b
b + a
然后，比较 (a + b) 和 （b+a）的数值谁小，如果 a+b 的数值更小，则保持当前 a,b 顺序不变，如果 b+a 的数值更小，则交换 a,b 位置。
比如 strs = [a, b]， a = "4"，b = "34"
a + b = "434"
b + a = "344"
可以发现 b+a 更小，因此交换 a,b 位置，strs变为[34, 3]，然后进行元素拼接得到 343 最大组合数。
原型题可参考：

【最大值】_华为od程序员阿甘-CSDN博客

  */
public class 数组组成的最小数字 {
    public static void main(String[] args) {
        
         Scanner sc = new Scanner(System.in);
 
        String[] nums = sc.nextLine().split(",");
        Arrays.sort(nums, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));
 
        nums = Arrays.copyOfRange(nums, 0, Math.min(3, nums.length));
        Arrays.sort(nums, (a, b) -> (a + b).compareTo(b + a));
 
        for (String num : nums) {
            System.out.print(num);
        }
    }
}
